package org.example.controller;

import cn.dev33.satoken.stp.SaTokenInfo;
import cn.dev33.satoken.stp.StpUtil;
import cn.dev33.satoken.util.SaResult;
import org.example.entity.UserInfo;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {
    /**
     * 测试登录，浏览器访问： http://localhost:8081/user/doLogin?username=zhang&password=123456
     */
    @RequestMapping("/doLogin")
    public SaResult doLogin(String username, String password) {
        // 此处仅作模拟示例，真实项目需要从数据库中查询数据进行比对 
        if("zhang".equals(username) && "123456".equals(password)) {
            // 第1步，先登录上
            StpUtil.login(10001);
        }
        //第2步，加载用户信息和权限信息
        StpUtil.getSession().set("loginInfo", new UserInfo(10001L, "张三", "123123@163.com"));
        //加载权限，只给user.add的权限
        List<String> authList = new ArrayList<String>();
        authList.add("user.add");
        StpUtil.getSession().set("authList", authList);

        // 第3步，获取 Token  相关参数
        SaTokenInfo tokenInfo = StpUtil.getTokenInfo();
        // 第4步，返回给前端
        return SaResult.data(tokenInfo);
    }

    /**
     * 查询登录状态
     */
    @RequestMapping("/isLogin")
    public String isLogin() {
        return "当前会话是否登录：" + StpUtil.isLogin();
    }

    /**
     * 获取用户信息
     */
    @RequestMapping("/getUserInfo")
    public UserInfo getUserInfo() {
        UserInfo loginInfo = (UserInfo) StpUtil.getSession().get("loginInfo");
        return loginInfo;
    }

    /**
     * 测试方法校验权限
     */
    @GetMapping(value = "/add")
    public String add(){
        StpUtil.checkPermission("user.add");
        return "ok";
    }
    @GetMapping(value = "/update")
    public String update(){
        StpUtil.checkPermission("user.update");
        return "ok";
    }
}
